package com.example.thread.base.demo2;

/**
 * @author LiYuhang
 * @version 0.1
 * @application
 * @Date 2020/8/14 10:46
 */

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 底层：返回ThreadPoolExecutor实例，接收参数为所设定线程数量nThread，corePoolSize为nThread，maximumPoolSize为nThread；
 * keepAliveTime为0L(不限时)；unit为：TimeUnit.MILLISECONDS；WorkQueue为：new LinkedBlockingQueue<Runnable>() 无界阻塞队列
 * 通俗：创建可容纳固定数量线程的池子，每隔线程的存活时间是无限的，当池子满了就不在添加线程了；
 * 如果池中的所有线程均在繁忙状态，对于新任务会进入阻塞队列中(无界的阻塞队列)
 * 适用：执行长期的任务，性能好很多
 */
@Slf4j(topic = "FixedThreadPool")
public class FixedThreadPool {

    /**
     * 1.创建固定大小的线程池。每次提交一个任务就创建一个线程，直到线程达到线程池的最大大小<br>
     * 2.线程池的大小一旦达到最大值就会保持不变，如果某个线程因为执行异常而结束，那么线程池会补充一个新线程<br>
     * 3.因为线程池大小为3，每个任务输出index后sleep 2秒，所以每两秒打印3个数字，和线程名称<br>
     */
    public static void fixTheadPoolTest(Integer limit) {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 0; i < limit; i++) {
            int finalI = i;
            fixedThreadPool.execute(() -> {
                log.info("线程名称：{}，执行{}",Thread.currentThread().getName(),finalI);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    log.error("InterruptedException",e);
                }
            });
        }
        fixedThreadPool.shutdown();
    }
}
